package studia.figlewicz.math.library;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public abstract class Model {
	
	protected Map<String, ZmiennaObjasniajaca> zmienneObjasniajace = new HashMap<String, ZmiennaObjasniajaca>();
	public Map<String, ZmiennaObjasniajaca> getZmienneObjasniajace() {
		return zmienneObjasniajace;
	}
	public void setZmienneObjasniajace(
			Map<String, ZmiennaObjasniajaca> zmienneObjasniajace) {
		this.zmienneObjasniajace = zmienneObjasniajace;
	}
	

	protected final KierunekProjekcji kierunek = KierunekProjekcji.FORWARD;
	
	protected Date poczatekProjekcji = null;
	public Date getPoczatekProjekcji() {
		return poczatekProjekcji;
	}
	public void setPoczatekProjekcji(Date poczatekProjekcji) {
		this.poczatekProjekcji = poczatekProjekcji;
	}
	
	public boolean setZmiennaObjasniajaca(String nazwa, ZmiennaObjasniajaca zmienna) {
		boolean resoult = false;
		if (isObjasniajaca(nazwa)) {
			zmienneObjasniajace.put(nazwa, zmienna);
			resoult = true;
		}
		return resoult;
	}
	public ZmiennaObjasniajaca getZmiennaObjasniajaca(String nazwa) {
		ZmiennaObjasniajaca resoult = zmienneObjasniajace.get(nazwa);
		return resoult;
	}
	
	public abstract String[] getNazwyZmiennychObjasnianych();
	public abstract String[] getNazwyZmiennychObjasniajacych();
	protected abstract boolean isObjasniajaca(String nazwa);
	protected abstract boolean isObjasniana(String nazwa);
	
	public abstract Map<String, Double> wyznaczKrokProjekcji(Date dzienProjekcji, 
			Map<String, TrajektoriaProcesu> dotychczasoweTrajektorie);
	public abstract void inicjalucujProjekcje(Date poczatekSymulacji);
	
	public abstract Map<String, TrajektoriaProcesu> utworzBuforWynikuProjekcji();
}

